package cn.kent.simple;

import java.util.Arrays;

/**
 * 66. 加一
 * <p>
 * 给定一个由 整数 组成的 非空 数组所表示的非负整数，在该数的基础上加一。
 * 最高位数字存放在数组的首位， 数组中每个元素只存储单个数字。
 * 你可以假设除了整数 0 之外，这个整数不会以零开头。
 */
public class PlusOne {


    /**
     * 简洁写法
     */
    public static int[] plusOne2(int[] digits) {
        // 部分为9的情况
        int len = digits.length;
        for (int i = len - 1; i > -1; i--) {
            if (digits[i] == 9) {
                digits[i] = 0;
            } else {
                digits[i]++;
                return digits;
            }
        }

        // 全部为9的情况
        int[] res = new int[len + 1];
        res[0] = 1;
        return res;
    }

    /**
     * 0ms，但是不简洁
     */
    public static int[] plusOne(int[] digits) {
        int len = digits.length;
        if (digits[len - 1] < 9) {// 最后一位小于9的情况
            ++digits[len - 1];
            return digits;
        }
        // 最后一个是9的情况——判断是否全部是9
        // 全部为9的情况下，必须加一个新数组
        boolean bool = true;
        for (int i = 0; i < len; i++) {
            if (digits[i] == 9) {
                continue;
            }
            bool = false;
            break;
        }

        // 全部为9
        if (bool) { // 说明是全部为9
            int[] res = new int[len + 1];
            res[0] = 1;
            return res;
        }

        // 不全部是9的情况，从后往前进行递归, 不用新建数组
        digits[len - 1] = 0;
        for (int i = len - 2; i > -1; i--) {
            if (digits[i] == 9) {
                digits[i] = 0;
            } else {
                digits[i]++;
                break;
            }
        }
        return digits;
    }

    public static void main(String[] args) {
        int[] digits = {8, 9, 9};
        System.out.println("处理集打印如下：");
        Arrays.stream(digits).forEach((i) -> {
            System.out.printf(i + "\t");
        });
        System.out.println();

        int[] ints = plusOne2(digits);

        System.out.println("结果集打印如下：");
        Arrays.stream(ints).forEach((i) -> {
            System.out.printf(i + "\t");
        });

    }
}
